package com.jh.paymentchannel.helipay.service;

import java.math.RoundingMode;
import java.net.URI;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;

import com.jh.paymentchannel.helipay.util.HeliPayBase;
import com.jh.paymentchannel.service.AutomaticRepaymentTaskService;
import com.jh.paymentchannel.service.SpendService;
import com.jh.paymentchannel.util.Util;

import cn.jh.common.utils.CommonConstants;
import net.sf.json.JSONObject;

@EnableScheduling
@Configuration
public class HK_SingleService {
	@Autowired
	Util util;

	@Value("${schedule-task.on-off}")
	private String scheduleTaskOnOff;
	@Autowired
	AutomaticRepaymentTaskService arts;
	@Autowired
    SpendService ss;
	private static final Logger log = LoggerFactory.getLogger(HK_SingleService.class);

	/* 10~23点每8分钟执行一次 */
	@Scheduled(cron = "0 0/8 10-23 * * ?")
	public void theWayOnHK() {
		/* 获取开始到结束的五分钟时间段[00:00:00~00:04:00] */
		if ("true".equals(scheduleTaskOnOff)) {
			Date date = new Date();
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
			String start = sdf.format(date);
			//String mm = start.substring(15, 16);
			long millistimes = date.getTime();
			millistimes -= 420000;
			Calendar calendar = Calendar.getInstance();
			calendar.setTimeInMillis(millistimes);
			start = sdf.format(calendar.getTime());
			calendar.setTimeInMillis(millistimes + 840000);
			String end = sdf.format(calendar.getTime());
			/* 根据执行时间查询任务 */
			RestTemplate restTemplate = new RestTemplate();
			URI uri = util.getServiceUrl("paymentchannel", "error url request!");
			String url = uri.toString() + "/v1.0/paymentchannel/automaticrepaymenttask/find";
			log.info("==============" + url + "===============");
			MultiValueMap<String, String> requestEntity = new LinkedMultiValueMap<String, String>();
			requestEntity.add("start", start);
			requestEntity.add("end", end);
			requestEntity.add("type", "1");
			log.info("接口/v1.0/paymentchannel/automaticrepaymenttask/find--参数================" + start + "," + end);
			Object result = restTemplate.postForObject(url, requestEntity, String.class);
			log.info("接口/v1.0/paymentchannel/automaticrepaymenttask/find--RESULT================" + result);
			JSONObject jsonObject = JSONObject.fromObject(result);
			List<JSONObject> list = null;
			if (jsonObject.containsKey("result")) {
				list = (List) jsonObject.get("result");
			} else {
				return;
			}

			for (int i = 0; i < list.size(); i++) {
				JSONObject art = list.get(i);
				log.info("==============" + art.toString() + "=============");
				String P5_orderId = art.getString("orderCode");
				String P3_userId = art.getString("userId");
				String P4_bindId = art.getString("bindId");
				String P8_orderAmount = art.getString("realAmount");
				String amount = art.getString("amount");
				String status = art.getString("status");
				String payCard = art.getString("payCard");
				String rate  = art.getString("rate");
				if ("1".equals(status))
					continue;
				/* 根据bindid查询用户到账卡号、手机号 */
				restTemplate = new RestTemplate();
				uri = util.getServiceUrl("paymentchannel", "error url request!");
				url = uri.toString() + "/v1.0/paymentchannel/hlregister/findbycard";
				requestEntity = new LinkedMultiValueMap<String, String>();
				requestEntity.add("bindId", P4_bindId);
				result = restTemplate.postForObject(url, requestEntity, String.class);
				log.info("接口/v1.0/paymentchannel/hlregister/findbycard--RESULT================" + result);
				jsonObject = JSONObject.fromObject(result);
				String bankCard = null;
				String phone = null;
				String loginPhone = null;
				if (jsonObject.containsKey("result")) {
					JSONObject jobj = jsonObject.getJSONObject("result");
					bankCard = jobj.getString("bankCard");
					phone = jobj.getString("phone");
					loginPhone = jobj.getString("loginPhone");
				} else {
				}
				/* 根据userid查询用户贴牌 */
				restTemplate = new RestTemplate();
				uri = util.getServiceUrl("user", "error url request!");
				url = uri.toString() + "/v1.0/user/find/by/userid";
				requestEntity = new LinkedMultiValueMap<String, String>();
				requestEntity.add("userId", P3_userId);
				result = restTemplate.postForObject(url, requestEntity, String.class);
				log.info("接口/v1.0/user/find/by/userid--RESULT================" + result);
				jsonObject = JSONObject.fromObject(result);
				String brandId = null;
				if (jsonObject.containsKey("result")) {
					JSONObject jobj = jsonObject.getJSONObject("result");
					brandId = jobj.getString("brandId");
				} else {
				}
				uri = util.getServiceUrl("paymentchannel", "error url request!");
				url = uri.toString() + "/v1.0/paymentchannel/spend/find/byordercode";
				requestEntity = new LinkedMultiValueMap<String, String>();
				requestEntity.add("orderCode", P5_orderId);
				result = restTemplate.postForObject(url, requestEntity, String.class);
				log.info("接口/v1.0/paymentchannel/spend/find/byordercode--RESULT================" + result);
				jsonObject = JSONObject.fromObject(result);
				List<JSONObject> listspend = null;
				String realmoney = null;
				String fianlmoney = null;
				if (jsonObject.containsKey("result")) {
					listspend = (List) jsonObject.get("result");
					log.info("list================" + listspend.toString());
					int statall = 0;
					/*if (listspend.size() == 1) {
						statall = listspend.get(0).getInt("status");
						String branchamount = listspend.get(0).getString("amount");
						if (statall == 0) {
							uri = util.getServiceUrl("facade", "error url request!");
							url = uri.toString() + "/v1.0/facade/topup";
							log.info("==============" + url + "===============");
							requestEntity = new LinkedMultiValueMap<String, String>();
							requestEntity.add("phone", loginPhone);
							requestEntity.add("amount", branchamount);
							requestEntity.add("channe_tag", "HL_PAY");
							requestEntity.add("order_desc", "信用卡消费任务");
							requestEntity.add("brand_id", brandId);
							requestEntity.add("bank_card", payCard);
							log.info("接口/v1.0/facade/topup--参数================" + requestEntity);
							result = restTemplate.postForObject(url, requestEntity, String.class);
							log.info("接口/v1.0/facade/topup--RESULT================" + result);
							jsonObject = JSONObject.fromObject(result);
							if (CommonConstants.SUCCESS.equals(jsonObject.get("resp_code"))) {
								uri = util.getServiceUrl("paymentchannel", "error url request!");
								url = uri.toString() + "/v1.0/paymentchannel/spend/update/byordercode";
								requestEntity = new LinkedMultiValueMap<String, String>();
								requestEntity.add("orderCode", P5_orderId);
								requestEntity.add("amount", String.valueOf(amount));
								requestEntity.add("status", "3");// 消费成功
								requestEntity.add("message", "成功");
								result = restTemplate.postForObject(url, requestEntity, String.class);
								log.info("接口/v1.0/paymentchannel/spend/update/byordercode--RESULT================"
										+ result);
							} else {
								if (jsonObject.containsKey("resp_message")
										&& !"".equals(jsonObject.getString("resp_message"))) {
									if ("502".equals(jsonObject.getString("resp_message"))||jsonObject.getString("resp_message").contains("异常")) {
										uri = util.getServiceUrl("paymentchannel", "error url request!");
										url = uri.toString() + "/v1.0/paymentchannel/spend/update/byordercode";
										requestEntity = new LinkedMultiValueMap<String, String>();
										requestEntity.add("orderCode", P5_orderId);
										requestEntity.add("amount", String.valueOf(amount));
										requestEntity.add("status", "3");
										requestEntity.add("message", jsonObject.getString("resp_message"));
										result = restTemplate.postForObject(url, requestEntity, String.class);
										log.info(
												"接口/v1.0/paymentchannel/spend/update/byordercode--RESULT================"
														+ result);
									}
									uri = util.getServiceUrl("paymentchannel", "error url request!");
									url = uri.toString() + "/v1.0/paymentchannel/spend/update/byordercode";
									requestEntity = new LinkedMultiValueMap<String, String>();
									requestEntity.add("orderCode", P5_orderId);
									requestEntity.add("amount", String.valueOf(amount));
									requestEntity.add("status", "5");// 其他
									requestEntity.add("message", jsonObject.getString("resp_message"));
									result = restTemplate.postForObject(url, requestEntity, String.class);
									log.info("接口/v1.0/paymentchannel/spend/update/byordercode--RESULT================"
											+ result);
								}
								uri = util.getServiceUrl("paymentchannel", "error url request!");
								url = uri.toString() + "/v1.0/paymentchannel/spend/update/byordercode";
								requestEntity = new LinkedMultiValueMap<String, String>();
								requestEntity.add("orderCode", P5_orderId);
								requestEntity.add("amount", String.valueOf(amount));
								requestEntity.add("status", "5");// 失败
								requestEntity.add("message", "失败原因不明");
								result = restTemplate.postForObject(url, requestEntity, String.class);
								log.info("接口/v1.0/paymentchannel/spend/update/byordercode--RESULT================"
										+ result);
							}
						}
						if (statall != 3) {
							uri = util.getServiceUrl("paymentchannel", "error url request!");
							url = uri.toString() + "/v1.0/paymentchannel/automaticrepaymenttask/update";
							requestEntity = new LinkedMultiValueMap<String, String>();
							requestEntity.add("orderCode", P5_orderId);
							requestEntity.add("status", "2");// 失败
							result = restTemplate.postForObject(url, requestEntity, String.class);
							log.info("接口/v1.0/paymentchannel/automaticrepaymenttask/update--RESULT================"
									+ result);
							continue;
						}
					} else {*/
						
						for (int ii = 0; ii < 2; ii++) {
							statall += listspend.get(ii).getInt("status");
							String branchamount2 = listspend.get(ii).getString("amount");
							if(listspend.get(ii).getInt("status") == 3) {
								realmoney = listspend.get(ii).getString("amount");
								DecimalFormat decimalFormat = new DecimalFormat("0.00");
								decimalFormat.setRoundingMode(RoundingMode.HALF_UP);
								fianlmoney = decimalFormat.format((Float.valueOf(realmoney)-(Float.valueOf(realmoney)*Float.valueOf(rate)+Float.valueOf("0.5"))));
							}
							if (listspend.get(ii).getInt("status") == 0) {
								uri = util.getServiceUrl("facade", "error url request!");
								url = uri.toString() + "/v1.0/facade/topup";
								log.info("==============" + url + "===============");
								requestEntity = new LinkedMultiValueMap<String, String>();
								requestEntity.add("phone", loginPhone);
								requestEntity.add("amount", branchamount2);
								requestEntity.add("channe_tag", "HL_PAY");
								requestEntity.add("order_desc", "信用卡消费任务");
								requestEntity.add("brand_id", brandId);
								requestEntity.add("bank_card", payCard);
								log.info("接口/v1.0/facade/topup--参数================" + requestEntity);
								result = restTemplate.postForObject(url, requestEntity, String.class);
								log.info("接口/v1.0/facade/topup--RESULT================" + result);
								jsonObject = JSONObject.fromObject(result);
								String orderson = jsonObject.getString("order");
								if(orderson.equals("123456")) {
									continue;
								}
								result = ss.addorderson(P5_orderId, branchamount2, orderson);
								log.info("=========================="+result+"===========================");
								if (CommonConstants.SUCCESS.equals(jsonObject.get("resp_code"))) {
									uri = util.getServiceUrl("paymentchannel", "error url request!");
									url = uri.toString() + "/v1.0/paymentchannel/spend/update/byordercode";
									requestEntity = new LinkedMultiValueMap<String, String>();
									requestEntity.add("orderCode", P5_orderId);
									requestEntity.add("amount", branchamount2);
									requestEntity.add("status", "3");// 消费成功
									requestEntity.add("message", "成功");
									result = restTemplate.postForObject(url, requestEntity, String.class);
									log.info("接口/v1.0/paymentchannel/spend/update/byordercode--RESULT================"
											+ result);
									statall += 3;
								} else {
									if (jsonObject.containsKey("resp_message")
											&& !"".equals(jsonObject.getString("resp_message"))) {
										if ("502".equals(jsonObject.getString("resp_message"))||jsonObject.getString("resp_message").contains("异常")||jsonObject.getString("resp_message").contains("处理")) {
											uri = util.getServiceUrl("paymentchannel", "error url request!");
											url = uri.toString() + "/v1.0/paymentchannel/spend/update/byordercode";
											requestEntity = new LinkedMultiValueMap<String, String>();
											requestEntity.add("orderCode", P5_orderId);
											requestEntity.add("amount", branchamount2);
											requestEntity.add("status", "3");
											requestEntity.add("message", jsonObject.getString("resp_message"));
											result = restTemplate.postForObject(url, requestEntity, String.class);
											log.info(
													"接口/v1.0/paymentchannel/spend/update/byordercode--RESULT================"
															+ result);
											statall += 3;
										}
										uri = util.getServiceUrl("paymentchannel", "error url request!");
										url = uri.toString() + "/v1.0/paymentchannel/spend/update/byordercode";
										requestEntity = new LinkedMultiValueMap<String, String>();
										requestEntity.add("orderCode", P5_orderId);
										requestEntity.add("amount", branchamount2);
										requestEntity.add("status", "5");// 其他
										requestEntity.add("message", jsonObject.getString("resp_message"));
										result = restTemplate.postForObject(url, requestEntity, String.class);
										log.info(
												"接口/v1.0/paymentchannel/spend/update/byordercode--RESULT================"
														+ result);
										statall += 5;
									}
								}
							}
						}
						log.info("statall================" + statall);
						if (statall != 8)
							continue;
					}
				//}
				uri = util.getServiceUrl("paymentchannel", "error url request!");
				url = uri.toString() + "/v1.0/paymentchannel/pay/creditcardpayment";
				requestEntity = new LinkedMultiValueMap<String, String>();
				requestEntity.add("channe_tag", "CREDICTPAY");
				requestEntity.add("order_desc", "还款任务");
				requestEntity.add("brand_id", brandId);
				requestEntity.add("cardNo", bankCard);
				requestEntity.add("phone", loginPhone);
				requestEntity.add("orderCode", P5_orderId);
				requestEntity.add("userid", P3_userId);
				requestEntity.add("amount", fianlmoney);
				log.info("接口/v1.0/paymentchannel/pay/creditcardpayment--参数================" + requestEntity);
				result = restTemplate.postForObject(url, requestEntity, String.class);
				log.info("接口/v1.0/paymentchannel/pay/creditcardpayment--RESULT================" + result);
				jsonObject = JSONObject.fromObject(result);
				if ("000000".equals(jsonObject.getString("resp_code"))) {
					uri = util.getServiceUrl("paymentchannel", "error url request!");
					url = uri.toString() + "/v1.0/paymentchannel/topup/queryOrder";
					requestEntity = new LinkedMultiValueMap<String, String>();
					requestEntity.add("P1_bizType", "TransferQuery");
					requestEntity.add("P2_orderId", P5_orderId);
					requestEntity.add("P3_customerNumber", HeliPayBase.MERCHANT_NO);
					result = restTemplate.postForObject(url, requestEntity, String.class);
					log.info("接口/v1.0/paymentchannel/topup/queryOrder--RESULT================" + result);
					jsonObject = JSONObject.fromObject(result);
					if ("订单查询成功".equals(jsonObject.getString("message"))) {
						JSONObject jsonObj = jsonObject.getJSONObject("json");
						if ("0000".equals(jsonObj.getString("rt2_retCode"))) {
							if (jsonObj.containsKey("rt7_orderStatus")) {
								/*
								 * INIT已接收 DOING处理中 SUCCESS成功 FAIL失败 REFUND退款
								 */
								if ("INIT".equalsIgnoreCase(jsonObj.getString("rt7_orderStatus"))
										|| "DOING".equalsIgnoreCase(jsonObj.getString("rt7_orderStatus"))
										|| "SUCCESS".equalsIgnoreCase(jsonObj.getString("rt7_orderStatus"))) {
									result = arts.updateMoney(fianlmoney, realmoney, P5_orderId, "1");
									log.info("============"+result.toString()+"==============");
								}
							}
						} else {
							if (jsonObj.containsKey("rt7_orderStatus")) {
								if ("REFUND".equalsIgnoreCase(jsonObj.getString("rt7_orderStatus"))) {
									/*退款*/
									result = arts.updateMoney(fianlmoney, realmoney, P5_orderId, "4");
									log.info("============"+result.toString()+"==============");
								}
								if ("FAIL".equalsIgnoreCase(jsonObj.getString("rt7_orderStatus"))) {
									result = arts.updateMoney(fianlmoney, realmoney, P5_orderId, "2");
									log.info("============"+result.toString()+"==============");
								}
							}
						}
					}
				}
			}
		}
	}
}
